package com.zb.service.impl;

import javax.annotation.Resource;

import com.zb.enums.RoleEnum;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import com.zb.entity.User;
import com.zb.entity.vo.LoginUserVO;
import com.zb.exception.MyException;
import com.zb.repository.UserRepository;
import com.zb.service.UserService;
import com.zb.util.JsonTransfer;
import sun.rmi.runtime.Log;

import java.util.List;
import java.util.Objects;

/**
 * 用户服务实现类
 * @author
 */
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserRepository userRepository;

    /**
     * 注册新用户
     * 同时创建对应购物车
     *
     * @param newUser
     *            新增User对象
     * @return 插入后User对象
     */
    @Override
    public User insertSelective(User newUser) {
        String newPassword = new Md5Hash(newUser.getPassword(), newUser.getUsername(), 2).toString();
        newUser.setPassword(newPassword);
        // 级联保存

        return userRepository.save(newUser);
    }

    /**
     * 根据用户id删除用户
     *
     * @param userId
     *            用户id
     */
    @Override
    public void deleteUserById(long userId) {
        if (RoleEnum.USER.getName().equals(findById(userId).getRole())) {
            userRepository.deleteById(userId);
        } else {
            throw new MyException("无权删除管理员");
        }
    }

    /**
     * 更新用户信息
     * 
     * @param JSONUser
     *            JSON格式的用户信息
     * @param userId
     *            用户id
     * @return 更新后的用户
     */
    @Override
    public User updateUserInfo(String JSONUser, long userId) {
        User dataUser = findById(userId);
        User newUser = JsonTransfer.updateSelective(JSONUser, dataUser);
        return userRepository.save(newUser);
    }

    /**
     * 更新用户信息
     *
     * @param user
     *            用户对象
     * @return 更新后的用户
     */
    @Override
    public User updateUser(User user) {
        return userRepository.save(user);
    }

    /**
     * 修改用户密码
     *
     * @param password 新密码
     * @param userId   用户id
     * @return 更新后的用户
     */
    @Override
    public User updatePassword(String password, long userId) {
        User user = findById(userId);
        String newPassword = new Md5Hash(password, user.getUsername(), 2).toString();
        user.setPassword(newPassword);
        return userRepository.save(user);
    }

    /**
     * 登录
     *
     * @param userName
     *            用户名
     * @param password
     *            密码
     * @return 返回loginUserVO
     */
    @Override
    public LoginUserVO login(String userName, String password) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
        subject.login(token);
        return (LoginUserVO)subject.getPrincipals().getPrimaryPrincipal();
    }

    /**
     * 返回用户总数
     *
     * @return 用户总数
     */
    @Override
    public long getTotalNumber() {
        return userRepository.count();
    }

    /**
     * 分页查询
     * 包括管理员
     * 不包括被封禁用户
     *
     * @param pageNo
     *            起始页码
     * @param pageSize
     *            分页大小
     * @return 用户列表
     */
    @Override
    public Page<User> findAllByPage(int pageNo, int pageSize) {
        return userRepository.findAll(PageRequest.of(pageNo - 1, pageSize));
    }

    /**
     * 根据用户id查找用户
     *
     * @param user_id
     *            用户id
     * @return 对应user对象
     */
    @Override
    public User findById(long user_id) {
        User user = userRepository.findById(user_id).orElse(null);
        if (user == null) {
            throw new MyException("用户未找到");
        }
        return user;
    }

    /**
     * 根据用户名查找用户
     *
     * @param userName
     *            用户名
     * @return 对应User对象
     */
    @Override
    public User findByUserName(String userName) {
        User user = userRepository.findByUsername(userName);
        if (user == null) {
            throw new MyException("用户未找到");
        }
        return user;
    }

    /**
     * 获取用户粉丝数
     * @param userId
     * @return
     */
    @Override
    public List<User> findFollowersById(long userId) {
        List<User> followers = userRepository.findFollowersById(userId);
        return followers;
    }

    /**
     * 获取用户粉丝数量
     * @param userId
     * @return
     */
    @Override
    public Integer getFollowerCountById(long userId) {
        List<User> followers = userRepository.findFollowersById(userId);
        if(Objects.isNull(followers)){
            return 0;
        }
        return followers.size();
    }

    /**
     * 获取所有用户
     * @return
     */
    @Override
    public List<User> getAllUsers(){
        return userRepository.findAll();
    }

}
